from langdetect import detect
import langid

# 语言代码 -> 中文名称
lang_map = {
            'en': '英文', 'zh': '中文', 'zh-cn': '中文', 'zh-tw': '中文', 'zh-hk': '中文', 'zh-sg': '中文',
            'fr': '法文', 'de': '德文', 'es': '西班牙文', 'ru': '俄文', 'ja': '日文', 'ko': '韩文', 
            'ar': '阿拉伯文', 'pt': '葡萄牙文', 'it': '意大利文', 'nl': '荷兰文', 'sv': '瑞典文', 
            'da': '丹麦文', 'no': '挪威文', 'fi': '芬兰文', 'pl': '波兰文', 'tr': '土耳其文', 
            'th': '泰文', 'vi': '越南文', 'id': '印尼文', 'ms': '马来文', 'hi': '印地文', 
            'bn': '孟加拉文', 'ur': '乌尔都文', 'fa': '波斯文', 'he': '希伯来文', 'el': '希腊文', 
            'cs': '捷克文', 'hu': '匈牙利文', 'ro': '罗马尼亚文', 'bg': '保加利亚文', 
            'hr': '克罗地亚文', 'sk': '斯洛伐克文', 'sl': '斯洛文尼亚文', 'et': '爱沙尼亚文', 
            'lv': '拉脱维亚文', 'lt': '立陶宛文', 'uk': '乌克兰文', 'be': '白俄罗斯文', 
            'ka': '格鲁吉亚文', 'hy': '亚美尼亚文', 'az': '阿塞拜疆文', 'kk': '哈萨克文', 
            'ky': '吉尔吉斯文', 'uz': '乌兹别克文', 'tg': '塔吉克文', 'mn': '蒙古文', 
            'my': '缅甸文', 'km': '高棉文', 'lo': '老挝文', 'si': '僧伽罗文', 'ne': '尼泊尔文', 
            'gu': '古吉拉特文', 'pa': '旁遮普文', 'ta': '泰米尔文', 'te': '泰卢固文', 
            'ml': '马拉雅拉姆文', 'kn': '卡纳达文', 'or': '奥里亚文', 'as': '阿萨姆文', 
            'mr': '马拉地文', 'sa': '梵文', 'bo': '藏文', 'dz': '宗卡文', 'ti': '提格雷文', 
            'am': '阿姆哈拉文', 'sw': '斯瓦希里文', 'zu': '祖鲁文', 'af': '南非荷兰文', 
            'sq': '阿尔巴尼亚文', 'eu': '巴斯克文', 'ca': '加泰罗尼亚文', 'cy': '威尔士文', 
            'ga': '爱尔兰文', 'is': '冰岛文', 'mt': '马耳他文', 'mk': '马其顿文', 
            'sr': '塞尔维亚文', 'bs': '波斯尼亚文', 'me': '黑山文'
        }

def match_language_string(text: str | None) -> str:
    """返回语言代码（如 zh、en、it）。优先使用 langid，其次 langdetect。
    置信度阈值默认 0.85，不满足则继续尝试下一种；全部失败返回空字符串。
    """
    text = (text or "").strip()
    if not text:
        return ""

    # 1) langid 优先
    try:
        code, score = langid.classify(text)
        if score is not None and score >= 0.85:
            return (code or "").lower()
    except Exception:
        pass

    # 2) langdetect 备选（先取概率列表，再退而求其次）
    try:
        from langdetect import detect_langs  # 延迟导入避免顶层依赖
        probs = detect_langs(text)  # e.g. [it:0.97, en:0.02]
        if probs:
            best = max(probs, key=lambda x: x.prob)
            if getattr(best, 'prob', 0) >= 0.85:
                return (best.lang or "").lower()
    except Exception:
        pass

    try:
        code = detect(text)
        return (code or "").lower()
    except Exception:
        pass

    return ""

def get_language_cn_from_code(code: str | None) -> str:
    if not code:
        return ""
    code = code.lower()
    # 变体归一
    variants = {
        'zh-cn': 'zh','zh-tw': 'zh','zh-hk': 'zh','zh-sg': 'zh'
    }
    normalized = variants.get(code, code)
    return lang_map.get(normalized, normalized)

# 语言 -> 地区 映射与工具
_language_region_map = {
    'en': '美国',  # 英文统一美国
    'zh': '中国', 'zh-cn': '中国', 'zh-tw': '中国', 'zh-hk': '中国', 'zh-sg': '中国',
    'ja': '日本', 'ko': '韩国', 'de': '德国', 'fr': '法国', 'es': '西班牙', 'ru': '俄罗斯',
    'ar': '阿拉伯地区', 'hi': '印度', 'th': '泰国', 'vi': '越南', 'id': '印尼', 'ms': '马来西亚',
    'he': '以色列', 'tr': '土耳其', 'it': '意大利', 'pt': '葡萄牙', 'nl': '荷兰', 'sv': '瑞典',
    'da': '丹麦', 'no': '挪威', 'fi': '芬兰', 'pl': '波兰', 'cs': '捷克', 'hu': '匈牙利',
    'ro': '罗马尼亚', 'bg': '保加利亚', 'hr': '克罗地亚', 'sk': '斯洛伐克', 'sl': '斯洛文尼亚',
    'et': '爱沙尼亚', 'lv': '拉脱维亚', 'lt': '立陶宛', 'uk': '乌克兰', 'be': '白俄罗斯',
    'ka': '格鲁吉亚', 'hy': '亚美尼亚', 'az': '阿塞拜疆', 'kk': '哈萨克斯坦', 'ky': '吉尔吉斯斯坦',
    'uz': '乌兹别克斯坦', 'tg': '塔吉克斯坦', 'mn': '蒙古', 'my': '缅甸', 'km': '柬埔寨',
    'lo': '老挝', 'si': '斯里兰卡', 'ne': '尼泊尔', 'gu': '印度', 'pa': '印度', 'ta': '印度',
    'te': '印度', 'ml': '印度', 'kn': '印度', 'or': '印度', 'as': '印度', 'mr': '印度', 'sa': '印度',
    'bn': '孟加拉国', 'ur': '巴基斯坦', 'fa': '伊朗', 'el': '希腊', 'bo': '西藏', 'dz': '不丹', 
    'ti': '埃塞俄比亚', 'am': '埃塞俄比亚', 'sw': '坦桑尼亚', 'zu': '南非', 'af': '南非', 
    'sq': '阿尔巴尼亚', 'eu': '西班牙', 'ca': '西班牙', 'cy': '威尔士', 'ga': '爱尔兰', 
    'is': '冰岛', 'mt': '马耳他', 'mk': '马其顿', 'sr': '塞尔维亚', 'bs': '波斯尼亚', 'me': '黑山'
}

def get_region_by_language_code(code: str | None) -> str:
    if not code:
        return '未知'
    c = code.lower()
    # 归一化中文变体
    if c in ('zh-cn','zh-tw','zh-hk','zh-sg'):
        c = 'zh'
    # 英文统一美国
    if c in ('en','english'):
        return '美国'
    return _language_region_map.get(c, '未知')